#ifndef _PACKETHANDLER_H_
#define _PACKETHANDLER_H_

#include <Singleton.h>
#include <FunctionMap.h>

struct MSG_BASE;
class GameDBProxySession;
class AccountDBProxySession;
class GameServerSession;
class BattleServerSession;
class FieldServerSession;
class AgentServerSession;
class WorldServerSession;
class OpServerSession;
class GuildServerSession;

class PacketHandler : public util::Singleton<PacketHandler>
{
	typedef VOID (*fnHandler_DM)( GameDBProxySession *pGameDBProxySession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_MX)( AccountDBProxySession *pAccountDBProxySession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_GM)( GameServerSession *pGameServerSession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_BM)( BattleServerSession *pBattleServerSession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_FM)( FieldServerSession *pFieldServerSession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_AM)( AgentServerSession *pAgentServerSession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_MW)( WorldServerSession *pWorldServerSession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_MO)( OpServerSession *pOpServerSession, MSG_BASE *pMsg, WORD wSize );
	typedef VOID (*fnHandler_MZ)( GuildServerSession *pGuildServerSession, MSG_BASE *pMsg, WORD wSize );

public:
	PacketHandler();
	~PacketHandler();

	BOOL			RegisterHandler_DM();
	BOOL			RegisterHandler_MX();
	BOOL			RegisterHandler_GM();
	BOOL			RegisterHandler_BM();
	BOOL			RegisterHandler_FM();
	BOOL			RegisterHandler_AM();
	BOOL			RegisterHandler_MW();
	BOOL			RegisterHandler_MO();
	BOOL			RegisterHandler_MZ();

	BOOL			ParsePacket_DM( GameDBProxySession *pGameDBProxySession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_MX( AccountDBProxySession *pAccountDBProxySession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_GM( GameServerSession *pGameServerSession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_BM( BattleServerSession *pBattleServerSession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_FM( FieldServerSession *pFieldServerSession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_AM( AgentServerSession *pAgentServerSession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_MW( WorldServerSession *pWorldServerSession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_MO( OpServerSession *pOpServerSession, MSG_BASE *pMsg, WORD wSize );
	BOOL			ParsePacket_MZ( GuildServerSession *pGuildServerSession, MSG_BASE *pMsg, WORD wSize );

private:
	BOOL			AddHandler_DM( BYTE category, BYTE protocol, PacketHandler::fnHandler_DM fnHandler );
	BOOL			AddHandler_MX( BYTE category, BYTE protocol, PacketHandler::fnHandler_MX fnHandler );
	BOOL			AddHandler_GM( BYTE category, BYTE protocol, PacketHandler::fnHandler_GM fnHandler );
	BOOL			AddHandler_BM( BYTE category, BYTE protocol, PacketHandler::fnHandler_BM fnHandler );
	BOOL			AddHandler_FM( BYTE category, BYTE protocol, PacketHandler::fnHandler_FM fnHandler );
	BOOL			AddHandler_AM( BYTE category, BYTE protocol, PacketHandler::fnHandler_AM fnHandler );
	BOOL			AddHandler_MW( BYTE category, BYTE protocol, PacketHandler::fnHandler_MW fnHandler );
	BOOL			AddHandler_MO( BYTE category, BYTE protocol, PacketHandler::fnHandler_MO fnHandler );
	BOOL			AddHandler_MZ( BYTE category, BYTE protocol, PacketHandler::fnHandler_MZ fnHandler );

	struct FUNC_DM : public util::BASE_FUNC
	{
		fnHandler_DM	m_fnHandler;
	};
	struct FUNC_MX : public util::BASE_FUNC
	{
		fnHandler_MX	m_fnHandler;
	};
	struct FUNC_GM : public util::BASE_FUNC
	{
		fnHandler_GM	m_fnHandler;
	};
	struct FUNC_BM : public util::BASE_FUNC
	{
		fnHandler_BM	m_fnHandler;
	};
	struct FUNC_FM : public util::BASE_FUNC
	{
		fnHandler_FM	m_fnHandler;
	};
	struct FUNC_AM : public util::BASE_FUNC
	{
		fnHandler_AM	m_fnHandler;
	};
	struct FUNC_MW : public util::BASE_FUNC
	{
		fnHandler_MW	m_fnHandler;
	};
	struct FUNC_MO : public util::BASE_FUNC
	{
		fnHandler_MO	m_fnHandler;
	};
	struct FUNC_MZ : public util::BASE_FUNC
	{
		fnHandler_MZ	m_fnHandler;
	};

	util::FunctionMap		*m_pFuncMap_DM;
	util::FunctionMap		*m_pFuncMap_MX;
	util::FunctionMap		*m_pFuncMap_GM;
	util::FunctionMap		*m_pFuncMap_BM;
	util::FunctionMap		*m_pFuncMap_FM;
	util::FunctionMap		*m_pFuncMap_AM;
	util::FunctionMap		*m_pFuncMap_MW;
	util::FunctionMap		*m_pFuncMap_MO;
	util::FunctionMap		*m_pFuncMap_MZ;
};

#endif // _PACKETHANDLER_H_